#include "cli.h"
#include "stdlib.h"
#include "conexion.h"

struct cli_suscripcion{
  cli_callback func;
  void *o;
};

static int cli_n_suscripciones = 0;
static struct cli_suscripcion *cli_suscripciones = 0;
conexion *cliente_conexion;

/*
 *
 * SUSCRIPCIONES
 */

static void cli_publicar(conexion *con, int codigo, void *data, int size){
  int i;
  for(i=0; i<cli_n_suscripciones; i++){
    cli_suscripciones[i].func(codigo, data, size, cli_suscripciones[i].o);
  }
}

int cli_iniciar(){
  conexion_crear(&cliente_conexion, cli_publicar);
}

int cli_terminar(){
  conexion_destruir(&cliente_conexion);
}

int cli_suscribir(cli_callback func, void *o){
  cli_n_suscripciones++;
  cli_suscripciones = realloc(cli_suscripciones, sizeof(struct cli_suscripcion)*cli_n_suscripciones);
  cli_suscripciones[cli_n_suscripciones-1].func = func;
  cli_suscripciones[cli_n_suscripciones-1].o = o;
}

int cli_dessuscribir(void *o){
  int i;
  for(i=0; i<cli_n_suscripciones; i++){
    if(cli_suscripciones[i].o==o){
      cli_suscripciones[i].func = cli_suscripciones[cli_n_suscripciones-1].func;
      cli_suscripciones[i].o = cli_suscripciones[cli_n_suscripciones-1].o;
      cli_n_suscripciones--;
      cli_suscripciones = realloc(cli_suscripciones, sizeof(struct cli_suscripcion)*cli_n_suscripciones);
      i--;
    }
  }
}

/*
 *
 *  Sockets!!!
 */

int cli_status(int *codigo){
  if(cliente_conexion==0)
    return 1;//conexion no iniciada
  *codigo = cliente_conexion->status;
  return 0;
}


int cli_conectar(char *servidor){
  conexion_conectar(cliente_conexion, servidor);
}

int cli_enviar(void *datos, int size){
  conexion_enviar(cliente_conexion, datos, size);
} 

int cli_desconectar(){
  conexion_desconectar(cliente_conexion);
}

int cli_error(char **descripcion){
  *descripcion = "";
}

int cli_procesar(){
  conexion_procesar(cliente_conexion);
}

